﻿using System.Collections.Generic;
using System.Linq;
using hercules.Models.Dados;

namespace hercules.Models.Negocio
{
    public class NegocioCompra
    {
        /// <summary>
        /// Objeto genérico que faz a persistência dos dados.
        /// </summary>
        private readonly IRepositorioGenerico<Compra, ControleEstoqueEntities> repositorioCompra;

        /// <summary>
        /// Initializes a new instance of the <see cref="NegocioVenda"/> class.
        /// Construtor para inicializar os atributos.
        /// </summary>
        public NegocioCompra()
        {
            repositorioCompra = new RepositorioGenerico<Compra, ControleEstoqueEntities>("chave");
        }

        /// <summary>
        /// Método para fazer a inserção de venda.
        /// </summary>
        /// <param name="venda">Objeto que irá ser persistido</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Inserir(Compra compra)
        {
            repositorioCompra.Inserir(compra);
            return repositorioCompra.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para fazer a alteração de venda.
        /// </summary>
        /// <param name="objeto">Objeto que terá seus dados alterados</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Editar(Compra objeto)
        {
            Compra compra = Obter(objeto.numeroNota);
            compra.funcionario = objeto.funcionario;
            compra.fornecedor = objeto.fornecedor;
            compra.dataEmissao = objeto.dataEmissao;
            compra.baseCalculoST = objeto.baseCalculoST;
            compra.valorNota = objeto.valorNota;
            compra.baseCalculoIcms = objeto.baseCalculoIcms;
            compra.valorIcms = objeto.valorIcms;
            compra.valorST = objeto.valorST;
            compra.statusCompra = objeto.statusCompra;

            return repositorioCompra.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para remover um venda utilizando o número da nota da venda.
        /// </summary>
        /// <param name="numNota">Número da nota da venda que será removido.</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Remover(int numNota)
        {
            repositorioCompra.Remover(compra => compra.numeroNota == numNota);
            return repositorioCompra.SaveChanges() > 0;
        }

        /// <summary>
        /// Método que retorna uma lista com todos os vendas.
        /// </summary>
        /// <returns>A lista com os vendas.</returns>
        public List<Compra> ObterTodos
            ()
        {
            return repositorioCompra.ObterTodos().ToList();
        }

        /// <summary>
        /// Método que retorna um venda passando o número da nota.
        /// </summary>
        /// <param name="numNota">Número da nota da venda a ser retornado.</param>
        /// <returns>O venda desejado.</returns>
        public Compra Obter(int numNota)
        {
            return repositorioCompra.ObterEntidade(compra => compra.numeroNota == numNota);
        }

        /// <summary>
        /// Método para fazer a comparação entre duas vendas.
        /// </summary>
        /// <param name="venda1">Primeira venda.</param>
        /// <param name="venda2">Segunda venda.</param>
        /// <returns>True se eles forem iguais, caso contrário false.</returns>
        public bool Equals(Compra compra1, Compra compra2)
        {
            if (compra1.numeroNota.Equals(compra2.numeroNota) &&
                compra1.funcionario.Equals(compra2.funcionario) &&
                compra1.fornecedor.Equals(compra2.fornecedor) &&
                compra1.dataEmissao.Equals(compra2.dataEmissao) &&
                compra1.baseCalculoST.Equals(compra2.baseCalculoST) &&
                compra1.valorNota.Equals(compra2.valorNota) &&
                compra1.baseCalculoIcms.Equals(compra2.baseCalculoIcms) &&
                compra1.valorIcms.Equals(compra2.valorIcms) &&
                compra1.valorST.Equals(compra2.valorST) &&
                compra1.statusCompra.Equals(compra2.statusCompra))
            {
                return true;
            }

            return false;
        }
    }
}